#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#include "memory.h"
#include "timer.h"

#define MAX_TASKS 1000  // 最大任务数
typedef enum {
    TASK_UNUSED = 0,    // 未分配
    TASK_SLEEPING = 1,  // 已分配未运行
    TASK_RUNNING = 2,   // 在运行调度队列中
} TASK_FLASG;

struct TASK {
    int sel;  // gdt编号
    TASK_FLASG flags;
    int priority;  // 优先级
    // struct tss_struct tss;
};
struct TASKCTL {
    int running;  // 正在运行的任务数量，也是tasks最大索引+1
    int now;      // 当前正在运行的任务的索引
    struct TASK *tasks[MAX_TASKS];
    struct TASK tasks0[MAX_TASKS];
};
/**
 * @brief 初始化自动调度器，返回一个任务作为当前任务
 *
 * @param memman
 * @return struct TASK*
 */
struct TASK *task_init(struct MEMMAN *memman);
void task_run(struct TASK *task, int priority);
struct TASK *task_alloc(void);
void taskswitch(void);
void task_sleep(struct TASK *task);

extern struct TIMER g_task_timer;

#ifdef __cplusplus
}
#endif
